package com.geline.easyexcel.compute;

import cn.hutool.core.util.StrUtil;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * M个数据中选取N个数据返回排列组合结果
 *
 * @author: mengxin
 * @date: 2024/1/22 20:28
 */
public class ArrayCompute<T> {

    private Set<String> allList = new HashSet<>();

    public Set<String> calculate(T[] arr, int n, boolean disorder){
        List<T> list = new ArrayList();
        for(int i=0; i<n; i++){
            list.add(null);//存入null的目的是初始化数组长度为n，并且使其值不是需要求的数字里的数字
        }
        calculate(list, arr, n, disorder);
        return this.allList;
    }

    private void calculate(List<T> list, T[] arr, int n, boolean disorder){
        if(n==0){
            if(disorder){
                List<T> collect = list.stream().sorted().collect(Collectors.toList());
                this.allList.add(StrUtil.join(",", collect));
            }else {
                this.allList.add(StrUtil.join(",", list));
            }
            return;//重点，不能漏
        }
        for(int i=0; i<arr.length; i++){
            if(!list.contains(arr[i]))//查找list里有无此数字
                list.set(list.size()-n, arr[i]);//如果没有则存入list
            else
                continue;
            calculate(list, arr,n-1, disorder);//如果存入了一个数，就继续递归
            list.set(list.size()-n, null);//回溯时把list重置为null
        }
    }
}
